#include_function".\src\lib_Reimu.txt"

//0.275
//12
//6,7,7,6
let DMG_MAINSHOT=3.3;
let DMG_SUBSHOT=[ 1.65, 1.925, 1.925, 1.65];

sub onInitialize_ReimuA{
	onInitialize_Reimu;
	LoadPlayerShotData(csd~"src\data_playershot_ra.txt");
}



task Main{
	yield;
	MainShotFire;
	Options;
	BombEffect;
	th10_System;
}



task Options{
	let posx=[-32,-16,16,32];
	let posy=[8,32,32,8];
	let gang=0;
	let fire=false;
	let cenx=GetPlayerX;
	let ceny=GetPlayerY;
	let target=NULL;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	Move;
	CreateOptions;
	SlowMove;
	ShotControl;
	VanishControl;
	Rotate;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n);}
	}
	
	
	task Move{
		let ang;
		let distance;
		loop{
			if(OnMissed && !OnBorderOfLife){
				while(OnMissed){yield;}
				cenx=GetPlayerX;
				ceny=GetPlayerY;
			}else{
				ang=atan2(GetPlayerY-ceny,GetPlayerX-cenx);
				distance=((GetPlayerX-cenx)^2+(GetPlayerY-ceny)^2)^0.5;
				distance*=0.5;
				if(distance<1){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
				}else{
					cenx+=distance*cos(ang);
					ceny+=distance*sin(ang);
				}
			}
			yield;
		}
	}
	
	
	task SlowMove{
		let slowx03=[32,24,20,18,17,16.5,16.25,16];
		let slowx12=[16,12,10,9,8.5,8.25,8.125,8];
		let slowy=[8,14,17,18.5,19.25,19.625,19.8125,20];
		let fastx03=[32,31.75,31.5,31,30,28,24,16];
		let fastx12=[16,15.875,15.75,15.5,15,14,12,8];
		let fasty=[8,8.1875,8.375,8.75,9.5,11,14,20];
		let n=0;
		
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)){
					if(n<8){
						posx[0]=-slowx03[n];
						posy[0]=slowy[n];
						posx[1]=-slowx12[n];
						posx[2]=slowx12[n];
						posx[3]=slowx03[n];
						posy[3]=slowy[n];
						n++;
					}
				}else{
					if(n>0){
						n--;
						posx[0]=-fastx03[n];
						posy[0]=fasty[n];
						posx[1]=-fastx12[n];
						posx[2]=fastx12[n];
						posx[3]=fastx03[n];
						posy[3]=fasty[n];
					}
				}
			}
			yield;
		}
	}
	
	
	task ShotControl{
		let c=0;
		let obj=[];
		let id;
		let enemyID=[];
		
		let checkmax=10;
		let cnt=checkmax;
		
		loop{
			if((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD)){
				c=4;
			}
			
			if(c>0){
				fire=true;
				c--;
				yield;
				fire=false;
				loop(3){yield;}
			}
			
			ascent(i in EnumEnemyBegin..EnumEnemyEnd){
				id=EnumEnemyGetID(i);
				enemyID=enemyID~[id];
				obj=obj~[Obj_Create(OBJ_LASER)];
				Obj_SetPosition(obj[i],GetEnemyInfo(id,ENEMY_X),GetEnemyInfo(id,ENEMY_Y)-2);
				Obj_SetAngle(obj[i],90);
				ObjShot_SetGraphic(obj[i],3);
				ObjShot_SetDamage(obj[i],0);
				ObjShot_SetPenetration(obj[i],1);
				ObjLaser_SetLength(obj[i],1);
				ObjLaser_SetWidth(obj[i],1);
				ObjLaser_SetSource(obj[i],false);
				cnt--;
				if(c<0){break;}
			}
			cnt=checkmax;
			
			yield;
			
			target=NULL;
			ascent(i in 0..length(enemyID)){
				if(Obj_IsIntersected(obj[i]) && (GetEnemyInfoDefault(enemyID[i],ENEMY_X,9999)!=9999)){
					target=enemyID[i];
					break;
				}
			}
			enemyID=[];
			
			
			//`FbNe
			ascent(i in 0..length(obj)){
				Obj_Delete(obj[i]);
			}
			obj=[];
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task Rotate{
		loop{
			gang+=6;
			gang%=360;
			yield;
		}
	}
	
	
	task Option(num){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,0,0);
		ObjEffect_SetVertexUV(obj,1,0,16);
		ObjEffect_SetVertexUV(obj,2,16,0);
		ObjEffect_SetVertexUV(obj,3,16,16);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,8);
		ObjEffect_SetVertexXY(obj,2,8,-7);
		ObjEffect_SetVertexXY(obj,3,8,8);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,0,16);
		ObjEffect_SetVertexUV(obje,1,0,32);
		ObjEffect_SetVertexUV(obje,2,16,16);
		ObjEffect_SetVertexUV(obje,3,16,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		while(!Obj_BeDeleted(obj)){
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
			}
			ObjEffect_SetScale(obj,scalex,scaley);
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]);
			Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
			
			if(!OnMissed && !OnEvent){
				if(fire){
					HomingShot(Obj_GetX(obj),Obj_GetY(obj),DMG_SUBSHOT[num]);
				}
			}
			
			ObjEffect_SetAngle(obj,0,0,gang);
			ObjEffect_SetAngle(obje,0,0,-gang-90);
			
			timer--;
			
			if(timer==0){
				Option(num);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task HomingShot(x,y,dmg){
		let targetID=target;
		let obj=Obj_Create(OBJ_SHOT);
		let v=2;
		let ang=270;
		let gang=ang-90;
		let alpha=128;
		let dalpha=6.4;
		let objc;
		let searchflg=false;
		let flg=false;
		
		Obj_SetPosition(obj,x,y);
		Obj_SetSpeed(obj,12);
		Obj_SetAngle(obj,ang);
		ObjShot_SetGraphic(obj,2);
		ObjShot_SetDamage(obj,dmg);
		ObjShot_SetPenetration(obj,1);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,16,0);
		ObjEffect_SetVertexUV(obje,1,16,14);
		ObjEffect_SetVertexUV(obje,2,29,0);
		ObjEffect_SetVertexUV(obje,3,29,14);
		ObjEffect_SetVertexXY(obje,0,-6.5,-7);
		ObjEffect_SetVertexXY(obje,1,-6.5,7);
		ObjEffect_SetVertexXY(obje,2,6.5,-7);
		ObjEffect_SetVertexXY(obje,3,6.5,7);
		while(!Obj_BeDeleted(obj)){
			x=Obj_GetX(obj);
			y=Obj_GetY(obj);
			if(searchflg){
				ang=AngleSearch( atan2(GetEnemyInfo(targetID,ENEMY_Y)-y,GetEnemyInfo(targetID,ENEMY_X)-x),ang );
				gang=ang-90;
				Obj_SetAngle(obj,ang);
			}
			Obj_SetPosition(obje,x,y);
			ObjEffect_SetAngle(obje,0,0,gang);
			flg=Obj_IsIntersected(obj);
			
			objc=Obj_Create(OBJ_LASER);
			Obj_SetPosition(objc,GetEnemyInfo(targetID,ENEMY_X),GetEnemyInfo(targetID,ENEMY_Y)-2);
			Obj_SetAngle(objc,90);
			ObjShot_SetGraphic(objc,3);
			ObjShot_SetDamage(objc,0);
			ObjShot_SetPenetration(objc,1);
			ObjLaser_SetLength(objc,1);
			ObjLaser_SetWidth(objc,1);
			ObjLaser_SetSource(objc,false);
			yield;
			if(Obj_IsIntersected(objc) && (GetEnemyInfoDefault(targetID,ENEMY_X,9999)!=9999)){
				searchflg=true;
			}else{
				searchflg=false;
			}
			Obj_Delete(objc);
		}
		
		if(!flg){
			Obj_Delete(obje);
			return;
		}
		
		ObjEffect_SetRenderState(obje,ADD);
		ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
		ascent(i in 0..30){
			Obj_SetPosition(obje,x,y);
			x+=v*cos(ang);
			y+=v*sin(ang);
			ObjEffect_SetAngle(obje,0,0,gang);
			gang+=18;
			if(i>=10){
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
				alpha-=dalpha;
				ObjEffect_SetVertexUV(obje,0,16,16);
				ObjEffect_SetVertexUV(obje,1,16,30);
				ObjEffect_SetVertexUV(obje,2,29,16);
				ObjEffect_SetVertexUV(obje,3,29,30);
			}
			yield;
		}
		Obj_Delete(obje);
	}
	
	
	function AngleSearch(tang,ang){
		let dang=15;
		let ICross=cos(ang-tang);
		let CCross=cos(dang);
		if(ICross<CCross){
		let LCross=cos(ang-dang-tang);
		let RCross=cos(ang+dang-tang);
			if(LCross>RCross){
				ang-=dang;
			}else{
				ang+=dang;
			}
		}else{
			ang=tang;
		}
		return ang;
	}
}